//
//  HomeTableViewController.swift
//  新浪微博
//
//  Created by 李赛 on 15/5/9.
//  Copyright (c) 2015年 李赛. All rights reserved.
//

import UIKit
import SDWebImage

class HomeTableViewController: BaseTableViewController, StatusCellDelegate {

    @IBOutlet weak var titleButton: TitleButton!
    
    // 缓存行高
    /**
    cache 中得数据是非常不稳定的
    一旦系统内存不足  会自动清理cache
    */
    var rowHeightCache = NSCache()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setupTitleButton()
        
        // 如果用户登录 才需要加载数据
        if userLogon {
            loadData()
            // 设置刷新控件
            setupRefreshControl()
        }
        
    }

    // 微博数据数组
    var statuses : [Status]?{
        didSet {
            self.tableView.reloadData()
            // 关闭刷新按钮
            refreshControl?.endRefreshing()
        }
    }
    
    // 上啦刷新的标记
    var pullupRefreshFlag = false
    
    // 加载数据
    func loadData(){
        // 控件进入监听状态,  不会主动调用 需要程序员手动条用
        refreshControl?.beginRefreshing()
        // 设置since_id和max_id
        // 获取数组中得第一条和最后一条
        var since_id = statuses?.first?.id ?? 0
        var max_id = 0
        
        // 判断上啦刷新的标记
        if pullupRefreshFlag {
            since_id = 0
            max_id = statuses?.last?.id ?? 0
        }
        
        Status.loadStatuses(since_id, max_id: max_id) { (statuses) -> () in
            
            // 如果没有接收到数据
            if statuses == nil {
                println("没有新数据")
                // 关闭刷新控件
                self.refreshControl?.endRefreshing()
                return
            }
            /**
            如果是新刷新数据  直接给数组设置数据
            如果since_id > 0 则把数据添加到数组的最前面
            */
            
            if since_id > 0 {
                self.statuses = statuses! + self.statuses!
            }else if max_id > 0 {
                self.statuses! += statuses!
                // 恢复刷新标记
                self.pullupRefreshFlag = false
            }else {
                self.statuses = statuses
            }
        }
    }
    
    @IBAction func qrcodeClick(sender: AnyObject) {
        
        let sb = UIStoryboard(name: "QRCode", bundle: nil)
        let codeVC = sb.instantiateInitialViewController() as! UIViewController
        
        presentViewController(codeVC, animated: true, completion: nil)
    }
    
    // 设置刷新控件
    private func setupRefreshControl() {
        self.refreshControl = RefreshControl()
        
        // 设置监听方法
        self.refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 开始刷新数据
        loadData()
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        visitorLoginView?.setupInfo("visitordiscover_feed_image_house", message: "关注一些人，回这里看看有什么惊喜", isHome: true)
    }
    
    // 设置标题按钮
    func setupTitleButton(){
        if sharedUserAccount != nil{
            titleButton.setTitle(sharedUserAccount!.name! + " ", forState: UIControlState.Normal)
        }else{
            titleButton.setImage(nil, forState: UIControlState.Normal)
        }
    }
    
    // 设置转场动画代理
    let animatorDelegate = PopoverAnimator()
//
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
        if segue.identifier == "Home2Popover" {
            let popVC = segue.destinationViewController as! PopoverViewController
            
            popVC.transitioningDelegate = animatorDelegate
            
            // 设置展现的大小
            let x = (self.view.bounds.size.width - 200) * 0.5
            animatorDelegate.presentedFrame = CGRectMake(x, 56, 200, 240)
            
            // 设置展现方式
            popVC.modalPresentationStyle = UIModalPresentationStyle.Custom
        }
        
    }
    
    // MARK: - 选中照片 照片处理
    let photoAnimator = PhotoBrowserAnimator()
    
    func statusDidSelectPhoto(cell: StatusCell, pictureCell: PictureCell, photoIndex: Int) {
        println("选中照片\(cell.status?.pictureUrls![photoIndex])")
        
        // 实例化视图控制器
        let browser = PhotoBrowserViewController()
        // 这只图像数组
        browser.imgUrls = cell.status?.largePicUrls
        // 设置选中照片的索引
        browser.selectIndex = photoIndex
        // 设置转场的临时视图
        photoAnimator.dummyView = pictureCell.snapshotViewAfterScreenUpdates(false)
        
        // 坐标系的转换
        // 1 想对于collectionView的坐标
        var rect = pictureCell.frame
        // 2 将坐标转换到cell 的坐标系
        rect = cell.convertRect(rect, fromView: cell.pictureView)
        // 3 将坐标转换到 view 的坐标系
        rect = view.convertRect(rect, fromView: cell)
        // 4 修正contentOffset
        rect = CGRectOffset(rect, 0, -tableView.contentOffset.y)
        
        photoAnimator.dummyStartRect = rect
        // 设置dummyView的初始位置
        photoAnimator.dummyView?.frame = rect
        
        // 使用cell内部的图像 计算并且设置转场的约束位置
        photoAnimator.dummyEndRect = scaleImageRect(pictureCell.iconView.image!)
        // 设置modal的转场代理
        browser.transitioningDelegate = photoAnimator
        // 设置modal的类型
        browser.modalPresentationStyle = UIModalPresentationStyle.Custom
        
        // modal出来
        presentViewController(browser, animated: true, completion: nil)
    }
    
    // 根据图片 计算目标位置
    private func scaleImageRect(image : UIImage) -> CGRect {
        let scale = image.size.width / view.bounds.width
        var h = image.size.height / scale
        var y : CGFloat = 0
        
        // 长图
        if h > view.bounds.height {
            h = view.bounds.height
        }else {
            y = (view.bounds.height - h) * 0.5
        }
        return CGRectMake(0, y, view.bounds.width, h)
    }
    
    // MARK: - Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return statuses?.count ?? 0
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let status = statuses![indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCell.cellIndentifier(status)) as! StatusCell
        
        cell.status = status
        
        // 设置代理
        cell.photoDelegate = self
        
        // 如果是最后一个cell出现  并且没有正在刷新 
        if indexPath.row == (self.statuses!.count - 1) && !pullupRefreshFlag {
            // 设置刷新标记
            pullupRefreshFlag = true
            // 刷新数据
            loadData()
        }
        
        return cell
    }
    
    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 300
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        // 取出数据
        let status = statuses![indexPath.row]
        // 判断是否已经缓存的行高
        if rowHeightCache.objectForKey(status.id) != nil {
            // 返回缓存行高
            return rowHeightCache.objectForKey(status.id) as! CGFloat
        }
        // 取出一个cell
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCell.cellIndentifier(status)) as! StatusCell
        // 返回行高
        let height = cell.rowHeight(status)
        // 保存在缓存中
        rowHeightCache.setObject(height, forKey: status.id)
        
        return height
    }
}

extension HomeTableViewController : UIViewControllerTransitioningDelegate{
    func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? {
        return PopoverPresentationController(presentedViewController: presented, presentingViewController: presenting)
    }
}

